// 我们如果要处理异步, 可以建立一个 Promise 对象来实现
// 然后在里面定义什么时候该 .then 什么时候该 .catch
// Promise 的创建装点在于传入一个函数, 这个函数会马上执行, 并且有两个默认参数
// resolve, reject, 后续的逻辑是自由的, 什么时候你希望使用这个 promise 的人触发 .then 就调用 resolve
// 如果你希望使用 promise 的人触发 .catch 就调用 reject
// 希望创建一个函数, 传入一个字符串, 如果传入了, 这个字符串会在3秒后通过.then 触发后续处理
// 如果没有传入字符串, 应该报错, 进入.catch阶段
// 其中的原理是, promise 有三个状态, pending 等待中, fullfilled 完成, rejected 失败
// 当你创建promise的时候, 会所有代码会立即执行, 并自动进入等待
// 如果你处理完了异步的动作, 希望执行.then 可以调用 resolve 函数将状态改为 fullfilled 完成
// 如果你在处理过程中, 通过逻辑判断出问题, 可以调用 reject 函数将状态改为 rejected 失败, catch 会被执行
// function wait3second(str) {
//   return new Promise((resolve, reject) => {
//     console.log('这里的内容会马上执行')
//     setTimeout(() => {
//       if (str) {
//         resolve(str)
//       } else {
//         reject(new Error('没有传入字符串'))
//       }
//     }, 2000)
//   })
// }

// wait3second().then(res => {
//   console.log('这是成功', res)
// }).catch(err => {
//   console.log('出问题了', err)
// })

const green = () => {
  console.log('绿色')
}

const yellow = () => {
  console.log('黄色')
}

const red = () => {
  console.log('红色')
}

// 封装一个通用的演示函数, 通过传入一个时间可以让代码等待一段时间
const sleep = (time) => {
  return new Promise(
    resolve => {
      setTimeout(() => {
        resolve()
      }, time)
    }
  )
}

const main = async() => {
  // eslint-disable-next-line
  while (true) {
    green()
    await sleep(1000)
    yellow()
    await sleep(2000)
    red()
    await sleep(3000)
  }
}

main()
